This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

library(magrittr)
filename <-
  jsonlite::read_json("C:/Users/jacci/Documents/DS 710/coffee_roasting_profiles/data-raw/saved/Haiti--2021-02-09-20-15-17.json")
# filename2 <-
# jsonlite::toJSON("C:/Users/jacci/Documents/DS 710/coffee_roasting_profiles/data-raw/saved/Angola--2021-02-26-16-16-22.json")
get_data_to_display_at_upload(filename)
get_special_event_times(filename) 
get_data_of_times_temps(filename) 
get_event_times(filename)
times <- get_data_of_times_temps(filename) %>% dplyr::mutate_if(is.character, as.numeric)# 
special_times <- get_special_event_times(filename)
event_times <- get_event_times(filename) %>% dplyr::mutate_if(is.character, as.numeric)

    # Get data for certain parameters for chart
    time_zero = lubridate::as_datetime("1970-01-01 00:00:00 UTC")
    # time_max = max(as_datetime(profile$Time2), na.rm = TRUE)
    dry_end = lubridate::as_datetime(event_times$dry_time)
    first_crack_start = lubridate::as_datetime(event_times$fc_time_start)
    first_crack_end = lubridate::as_datetime(event_times$fc_time_end)
    second_crack_start = lubridate::as_datetime(event_times$sc_time_start)
    drop_time = lubridate::as_datetime(event_times$drop_time)
    max_temp = 500 # Highest temp in chart
plotly::plot_ly(
  # BT Line
  times,
  type = 'scatter',
  mode = 'lines',
  x = ~ lubridate::as_datetime(time),
  line = list(color = "#4DB848"),
  # x = ~seq(ms("00:00"), ms("10:10")),
  # x = ~ lubridate::ms(Time2),
  # x = ~ lubridate::as_datetime(Time1),
  y = ~ BT,
  # hovertemplate = paste('%{y: .1f}\u00b0F', '<br>%{x}<br>'),
  hovertemplate = '%{y: .1f}\u00b0F',
  showlegend = FALSE,
  name = "BT"
) %>%
  plotly::add_trace(
    times,
    # ET Line
    mode = 'lines',
    x = ~ lubridate::as_datetime(time),
    y = ~ ET,
    line = list(color = "#D50032"),
    name = "ET"
  ) %>%
  # add_trace(        # Change BT Line
  #   mode = 'lines',
  #   x = ~ lubridate::as_datetime(Time2),
  #   y = ~ change_BT,
  #   line = list(color = "#428BCA"),
  #   name = "\u0394BT",
  #   yaxis = "y2"
  # ) %>%
  plotly::layout(hovermode = "x unified") %>%
  # filter(!is.na(Event),
  #        !is.na(Time2),
  #        Event != "Drop",
  #        !grepl("^Charge", Event)) %>%
plotly::add_annotations(
  x =  ~lubridate::as_datetime(as.numeric(special_times$time_of_event)), # jitter() ?
  y = ~ 400,
  text = ~ special_times$type_of_event,
  # yaxis = "y2",
  textposition = "top center",
  showarrow = FALSE,
  # arrowhead = .5,
  # arrowwidth = 1,
  font = list(size = 12, color = "black")
  # bgcolor = ~ event_color
) %>%                     # Add lines for phases
plotly::add_segments(
  x = ~ dry_end,
  xend = ~ dry_end,
  y =  ~ 0,
  yend =  ~ max_temp,
  # opacity = 1,
  line = list(
    dash = "dash",
    color = '#AAAAAA',
    width = 2
  ),
  text = "Dry end"
) %>%
  plotly::add_segments(
    x = ~ first_crack_start,
    xend = ~ first_crack_start,
    y =  ~ 0,
    yend =  ~ max_temp,
    # opacity = 1,
    line = list(
      dash = "dash",
      color = '#AAAAAA',
      width = 2
    ),
    text = "FC start"
  ) %>%
  plotly::add_segments(
    x = ~ first_crack_end,
    xend = ~ first_crack_end,
    y =  ~ 0,
    yend =  ~ max_temp,
    # opacity = 1,
    line = list(
      dash = "dash",
      color = '#AAAAAA',
      width = 2
    ),
    text = "FC start"
  ) %>%
  # For second_crash_start
  # add_segments( x = ~first_crack_start, xend = ~first_crack_start, y =~ 0, yend=~500,
  #               # opacity = 1,
  #               line = list(dash="dash",
  #                           color = 'gray80',
  #                           width = 2), text = "FC start") %>%
  plotly::add_segments(
    x = ~ drop_time,
    xend = ~ drop_time,
    y =  ~ 0,
    yend =  ~ max_temp,
    # opacity = 1,
    line = list(
      dash = "dash",
      color = '#AAAAAA',
      width = 2
    ),
    text = "FC start"
  ) %>%
  plotly::layout(
    # The right side y-axis
    yaxis2 = list(
      zeroline = F,
      showline = F,
      showgrid = F,
      tickfont = list(color = "#428BCA"),
      ticksuffix = "\u00b0F",
      overlaying = "y",
      side = "right",
      title = ""
    ),
    xaxis = list(
      # gridcolor = toRGB("gray85"),
      title = "",
      zeroline = F,
      showline = F,
      showgrid = F,
      tick0 = time_zero,
      ticks = "inside",
      tickcolor = "rgb(245,245,245)",
      tickformat = "%M:%S",
      dtick = 30000 # Tick every 30 seconds
    ),
    yaxis = list(
      title = "",
      ticksuffix = "\u00b0F",
      zeroline = F,
      showline = F,
      showgrid = F
    ),
    margin = list(
      r = 30,
      l = 0,
      b = 0,
      t = 0
    ),
    plot_bgcolor = 'rgb(245,245,245)',
    # make grey background
    paper_bgcolor = 'rgb(245,245,245)'
  )
# mess with format

x=lubridate::as_datetime(as.numeric(times$time))
lubridate::hms(x)
lubridate::minute(x)
lubridate::seconds(x)
lubridate::seconds_to_period(as.numeric(times$time)) %>% lubridate::ms() # THIS?
lubridate::fast_strptime(x, format = "%H%M")
(parse_date_time2(times$time))

sub(":\\d{2}", "", times((minutes%/%60 +  minutes%%60 /3600)/24))

as.numeric(times$time)%/%60  +  as.numeric(times$time)%%60 /3600


   plotly::plot_ly(
      # BT Line
      times,
      type = 'scatter',
      mode = 'lines',
      x = ~ lubridate::as_datetime(as.numeric(time)),
      line = list(color = "#4DB848"),
      # x = ~seq(ms("00:00"), ms("10:10")),
      # x = ~ lubridate::ms(Time2),
      # x = ~ lubridate::as_datetime(Time1),
      y = ~ BT,
      # hovertemplate = paste('%{y: .1f}\u00b0F', '<br>%{x}<br>'),
      hovertemplate = '%{y: .1f}\u00b0F',
      showlegend = FALSE,
      name = "BT"
    ) %>% plotly::layout(xaxis = list(tickformat = "%M:%S"))
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KYGBge3J9DQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KZmlsZW5hbWUgPC0NCiAganNvbmxpdGU6OnJlYWRfanNvbigiQzovVXNlcnMvamFjY2kvRG9jdW1lbnRzL0RTIDcxMC9jb2ZmZWVfcm9hc3RpbmdfcHJvZmlsZXMvZGF0YS1yYXcvc2F2ZWQvSGFpdGktLTIwMjEtMDItMDktMjAtMTUtMTcuanNvbiIpDQojIGZpbGVuYW1lMiA8LQ0KIyBqc29ubGl0ZTo6dG9KU09OKCJDOi9Vc2Vycy9qYWNjaS9Eb2N1bWVudHMvRFMgNzEwL2NvZmZlZV9yb2FzdGluZ19wcm9maWxlcy9kYXRhLXJhdy9zYXZlZC9BbmdvbGEtLTIwMjEtMDItMjYtMTYtMTYtMjIuanNvbiIpDQpgYGANCmBgYHtyfQ0KZ2V0X2RhdGFfdG9fZGlzcGxheV9hdF91cGxvYWQoZmlsZW5hbWUpDQpnZXRfc3BlY2lhbF9ldmVudF90aW1lcyhmaWxlbmFtZSkgDQpnZXRfZGF0YV9vZl90aW1lc190ZW1wcyhmaWxlbmFtZSkgDQpnZXRfZXZlbnRfdGltZXMoZmlsZW5hbWUpDQpgYGANCmBgYHtyIHB1dCBkYXRhIGluIGNoYXJ0fQ0KdGltZXMgPC0NCiAgZ2V0X2RhdGFfb2ZfdGltZXNfdGVtcHMoZmlsZW5hbWUpICU+JQ0KICBkcGx5cjo6bXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykjDQpzcGVjaWFsX3RpbWVzIDwtIGdldF9zcGVjaWFsX2V2ZW50X3RpbWVzKGZpbGVuYW1lKQ0KZXZlbnRfdGltZXMgPC0NCiAgZ2V0X2V2ZW50X3RpbWVzKGZpbGVuYW1lKSAlPiUNCiAgZHBseXI6Om11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpDQoNCiAgICAjIEdldCBkYXRhIGZvciBjZXJ0YWluIHBhcmFtZXRlcnMgZm9yIGNoYXJ0DQogICAgdGltZV96ZXJvID0gbHVicmlkYXRlOjphc19kYXRldGltZSgiMTk3MC0wMS0wMSAwMDowMDowMCBVVEMiKQ0KICAgICMgdGltZV9tYXggPSBtYXgoYXNfZGF0ZXRpbWUocHJvZmlsZSRUaW1lMiksIG5hLnJtID0gVFJVRSkNCiAgICBkcnlfZW5kID0gbHVicmlkYXRlOjphc19kYXRldGltZShldmVudF90aW1lcyRkcnlfdGltZSkNCiAgICBmaXJzdF9jcmFja19zdGFydCA9IGx1YnJpZGF0ZTo6YXNfZGF0ZXRpbWUoZXZlbnRfdGltZXMkZmNfdGltZV9zdGFydCkNCiAgICBmaXJzdF9jcmFja19lbmQgPSBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKGV2ZW50X3RpbWVzJGZjX3RpbWVfZW5kKQ0KICAgIHNlY29uZF9jcmFja19zdGFydCA9IGx1YnJpZGF0ZTo6YXNfZGF0ZXRpbWUoZXZlbnRfdGltZXMkc2NfdGltZV9zdGFydCkNCiAgICBkcm9wX3RpbWUgPSBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKGV2ZW50X3RpbWVzJGRyb3BfdGltZSkNCiAgICBtYXhfdGVtcCA9IDUwMCAjIEhpZ2hlc3QgdGVtcCBpbiBjaGFydA0KcGxvdGx5OjpwbG90X2x5KA0KICAjIEJUIExpbmUNCiAgdGltZXMsDQogIHR5cGUgPSAnc2NhdHRlcicsDQogIG1vZGUgPSAnbGluZXMnLA0KICB4ID0gfiBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKHRpbWUpLA0KICBsaW5lID0gbGlzdChjb2xvciA9ICIjNERCODQ4IiksDQogICMgeCA9IH5zZXEobXMoIjAwOjAwIiksIG1zKCIxMDoxMCIpKSwNCiAgIyB4ID0gfiBsdWJyaWRhdGU6Om1zKFRpbWUyKSwNCiAgIyB4ID0gfiBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKFRpbWUxKSwNCiAgeSA9IH4gQlQsDQogICMgaG92ZXJ0ZW1wbGF0ZSA9IHBhc3RlKCcle3k6IC4xZn1cdTAwYjBGJywgJzxicj4le3h9PGJyPicpLA0KICBob3ZlcnRlbXBsYXRlID0gJyV7eTogLjFmfVx1MDBiMEYnLA0KICBzaG93bGVnZW5kID0gRkFMU0UsDQogIG5hbWUgPSAiQlQiDQopICU+JQ0KICBwbG90bHk6OmFkZF90cmFjZSgNCiAgICB0aW1lcywNCiAgICAjIEVUIExpbmUNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICB4ID0gfiBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKHRpbWUpLA0KICAgIHkgPSB+IEVULA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gIiNENTAwMzIiKSwNCiAgICBuYW1lID0gIkVUIg0KICApICU+JQ0KICAjIGFkZF90cmFjZSggICAgICAgICMgQ2hhbmdlIEJUIExpbmUNCiAgIyAgIG1vZGUgPSAnbGluZXMnLA0KICAjICAgeCA9IH4gbHVicmlkYXRlOjphc19kYXRldGltZShUaW1lMiksDQogICMgICB5ID0gfiBjaGFuZ2VfQlQsDQogICMgICBsaW5lID0gbGlzdChjb2xvciA9ICIjNDI4QkNBIiksDQogICMgICBuYW1lID0gIlx1MDM5NEJUIiwNCiAgIyAgIHlheGlzID0gInkyIg0KICAjICkgJT4lDQogIHBsb3RseTo6bGF5b3V0KGhvdmVybW9kZSA9ICJ4IHVuaWZpZWQiKSAlPiUNCiAgIyBmaWx0ZXIoIWlzLm5hKEV2ZW50KSwNCiAgIyAgICAgICAgIWlzLm5hKFRpbWUyKSwNCiAgIyAgICAgICAgRXZlbnQgIT0gIkRyb3AiLA0KICAjICAgICAgICAhZ3JlcGwoIl5DaGFyZ2UiLCBFdmVudCkpICU+JQ0KcGxvdGx5OjphZGRfYW5ub3RhdGlvbnMoDQogIHggPSAgfmx1YnJpZGF0ZTo6YXNfZGF0ZXRpbWUoYXMubnVtZXJpYyhzcGVjaWFsX3RpbWVzJHRpbWVfb2ZfZXZlbnQpKSwgIyBqaXR0ZXIoKSA/DQogIHkgPSB+IDQwMCwNCiAgdGV4dCA9IH4gc3BlY2lhbF90aW1lcyR0eXBlX29mX2V2ZW50LA0KICAjIHlheGlzID0gInkyIiwNCiAgdGV4dHBvc2l0aW9uID0gInRvcCBjZW50ZXIiLA0KICBzaG93YXJyb3cgPSBGQUxTRSwNCiAgIyBhcnJvd2hlYWQgPSAuNSwNCiAgIyBhcnJvd3dpZHRoID0gMSwNCiAgZm9udCA9IGxpc3Qoc2l6ZSA9IDEyLCBjb2xvciA9ICJibGFjayIpDQogICMgYmdjb2xvciA9IH4gZXZlbnRfY29sb3INCikgJT4lICAgICAgICAgICAgICAgICAgICAgIyBBZGQgbGluZXMgZm9yIHBoYXNlcw0KcGxvdGx5OjphZGRfc2VnbWVudHMoDQogIHggPSB+IGRyeV9lbmQsDQogIHhlbmQgPSB+IGRyeV9lbmQsDQogIHkgPSAgfiAwLA0KICB5ZW5kID0gIH4gbWF4X3RlbXAsDQogICMgb3BhY2l0eSA9IDEsDQogIGxpbmUgPSBsaXN0KA0KICAgIGRhc2ggPSAiZGFzaCIsDQogICAgY29sb3IgPSAnI0FBQUFBQScsDQogICAgd2lkdGggPSAyDQogICksDQogIHRleHQgPSAiRHJ5IGVuZCINCikgJT4lDQogIHBsb3RseTo6YWRkX3NlZ21lbnRzKA0KICAgIHggPSB+IGZpcnN0X2NyYWNrX3N0YXJ0LA0KICAgIHhlbmQgPSB+IGZpcnN0X2NyYWNrX3N0YXJ0LA0KICAgIHkgPSAgfiAwLA0KICAgIHllbmQgPSAgfiBtYXhfdGVtcCwNCiAgICAjIG9wYWNpdHkgPSAxLA0KICAgIGxpbmUgPSBsaXN0KA0KICAgICAgZGFzaCA9ICJkYXNoIiwNCiAgICAgIGNvbG9yID0gJyNBQUFBQUEnLA0KICAgICAgd2lkdGggPSAyDQogICAgKSwNCiAgICB0ZXh0ID0gIkZDIHN0YXJ0Ig0KICApICU+JQ0KICBwbG90bHk6OmFkZF9zZWdtZW50cygNCiAgICB4ID0gfiBmaXJzdF9jcmFja19lbmQsDQogICAgeGVuZCA9IH4gZmlyc3RfY3JhY2tfZW5kLA0KICAgIHkgPSAgfiAwLA0KICAgIHllbmQgPSAgfiBtYXhfdGVtcCwNCiAgICAjIG9wYWNpdHkgPSAxLA0KICAgIGxpbmUgPSBsaXN0KA0KICAgICAgZGFzaCA9ICJkYXNoIiwNCiAgICAgIGNvbG9yID0gJyNBQUFBQUEnLA0KICAgICAgd2lkdGggPSAyDQogICAgKSwNCiAgICB0ZXh0ID0gIkZDIGVuZCINCiAgKSAlPiUNCiAgIyBGb3Igc2Vjb25kX2NyYXNoX3N0YXJ0DQogICMgYWRkX3NlZ21lbnRzKCB4ID0gfmZpcnN0X2NyYWNrX3N0YXJ0LCB4ZW5kID0gfmZpcnN0X2NyYWNrX3N0YXJ0LCB5ID1+IDAsIHllbmQ9fjUwMCwNCiAgIyAgICAgICAgICAgICAgICMgb3BhY2l0eSA9IDEsDQogICMgICAgICAgICAgICAgICBsaW5lID0gbGlzdChkYXNoPSJkYXNoIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gJ2dyYXk4MCcsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDIpLCB0ZXh0ID0gIkZDIHN0YXJ0IikgJT4lDQogIHBsb3RseTo6YWRkX3NlZ21lbnRzKA0KICAgIHggPSB+IGRyb3BfdGltZSwNCiAgICB4ZW5kID0gfiBkcm9wX3RpbWUsDQogICAgeSA9ICB+IDAsDQogICAgeWVuZCA9ICB+IG1heF90ZW1wLA0KICAgICMgb3BhY2l0eSA9IDEsDQogICAgbGluZSA9IGxpc3QoDQogICAgICBkYXNoID0gImRhc2giLA0KICAgICAgY29sb3IgPSAnI0FBQUFBQScsDQogICAgICB3aWR0aCA9IDINCiAgICApLA0KICAgIHRleHQgPSAiRkMgc3RhcnQiDQogICkgJT4lDQogIHBsb3RseTo6bGF5b3V0KA0KICAgICMgVGhlIHJpZ2h0IHNpZGUgeS1heGlzDQogICAgeWF4aXMyID0gbGlzdCgNCiAgICAgIHplcm9saW5lID0gRiwNCiAgICAgIHNob3dsaW5lID0gRiwNCiAgICAgIHNob3dncmlkID0gRiwNCiAgICAgIHRpY2tmb250ID0gbGlzdChjb2xvciA9ICIjNDI4QkNBIiksDQogICAgICB0aWNrc3VmZml4ID0gIlx1MDBiMEYiLA0KICAgICAgb3ZlcmxheWluZyA9ICJ5IiwNCiAgICAgIHNpZGUgPSAicmlnaHQiLA0KICAgICAgdGl0bGUgPSAiIg0KICAgICksDQogICAgeGF4aXMgPSBsaXN0KA0KICAgICAgIyBncmlkY29sb3IgPSB0b1JHQigiZ3JheTg1IiksDQogICAgICB0aXRsZSA9ICIiLA0KICAgICAgemVyb2xpbmUgPSBGLA0KICAgICAgc2hvd2xpbmUgPSBGLA0KICAgICAgc2hvd2dyaWQgPSBGLA0KICAgICAgdGljazAgPSB0aW1lX3plcm8sDQogICAgICB0aWNrcyA9ICJpbnNpZGUiLA0KICAgICAgdGlja2NvbG9yID0gInJnYigyNDUsMjQ1LDI0NSkiLA0KICAgICAgdGlja2Zvcm1hdCA9ICIlTTolUyIsDQogICAgICBkdGljayA9IDMwMDAwICMgVGljayBldmVyeSAzMCBzZWNvbmRzDQogICAgKSwNCiAgICB5YXhpcyA9IGxpc3QoDQogICAgICB0aXRsZSA9ICIiLA0KICAgICAgdGlja3N1ZmZpeCA9ICJcdTAwYjBGIiwNCiAgICAgIHplcm9saW5lID0gRiwNCiAgICAgIHNob3dsaW5lID0gRiwNCiAgICAgIHNob3dncmlkID0gRg0KICAgICksDQogICAgbWFyZ2luID0gbGlzdCgNCiAgICAgIHIgPSAzMCwNCiAgICAgIGwgPSAwLA0KICAgICAgYiA9IDAsDQogICAgICB0ID0gMA0KICAgICksDQogICAgcGxvdF9iZ2NvbG9yID0gJ3JnYigyNDUsMjQ1LDI0NSknLA0KICAgICMgbWFrZSBncmV5IGJhY2tncm91bmQNCiAgICBwYXBlcl9iZ2NvbG9yID0gJ3JnYigyNDUsMjQ1LDI0NSknDQogICkNCmBgYA0KYGBge3J9DQojIG1lc3Mgd2l0aCBmb3JtYXQNCg0KeD1sdWJyaWRhdGU6OmFzX2RhdGV0aW1lKGFzLm51bWVyaWModGltZXMkdGltZSkpDQpsdWJyaWRhdGU6Omhtcyh4KQ0KbHVicmlkYXRlOjptaW51dGUoeCkNCmx1YnJpZGF0ZTo6c2Vjb25kcyh4KQ0KbHVicmlkYXRlOjpzZWNvbmRzX3RvX3BlcmlvZChhcy5udW1lcmljKHRpbWVzJHRpbWUpKSAlPiUgbHVicmlkYXRlOjptcygpICMgVEhJUz8NCmx1YnJpZGF0ZTo6ZmFzdF9zdHJwdGltZSh4LCBmb3JtYXQgPSAiJUglTSIpDQoocGFyc2VfZGF0ZV90aW1lMih0aW1lcyR0aW1lKSkNCg0Kc3ViKCI6XFxkezJ9IiwgIiIsIHRpbWVzKChtaW51dGVzJS8lNjAgKyAgbWludXRlcyUlNjAgLzM2MDApLzI0KSkNCg0KYXMubnVtZXJpYyh0aW1lcyR0aW1lKSUvJTYwICArICBhcy5udW1lcmljKHRpbWVzJHRpbWUpJSU2MCAvMzYwMA0KDQoNCiAgIHBsb3RseTo6cGxvdF9seSgNCiAgICAgICMgQlQgTGluZQ0KICAgICAgdGltZXMsDQogICAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgICAgbW9kZSA9ICdsaW5lcycsDQogICAgICB4ID0gfiBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKGFzLm51bWVyaWModGltZSkpLA0KICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiIzREQjg0OCIpLA0KICAgICAgIyB4ID0gfnNlcShtcygiMDA6MDAiKSwgbXMoIjEwOjEwIikpLA0KICAgICAgIyB4ID0gfiBsdWJyaWRhdGU6Om1zKFRpbWUyKSwNCiAgICAgICMgeCA9IH4gbHVicmlkYXRlOjphc19kYXRldGltZShUaW1lMSksDQogICAgICB5ID0gfiBCVCwNCiAgICAgICMgaG92ZXJ0ZW1wbGF0ZSA9IHBhc3RlKCcle3k6IC4xZn1cdTAwYjBGJywgJzxicj4le3h9PGJyPicpLA0KICAgICAgaG92ZXJ0ZW1wbGF0ZSA9ICcle3k6IC4xZn1cdTAwYjBGJywNCiAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSwNCiAgICAgIG5hbWUgPSAiQlQiDQogICAgKSAlPiUgcGxvdGx5OjpsYXlvdXQoeGF4aXMgPSBsaXN0KHRpY2tmb3JtYXQgPSAiJU06JVMiKSkNCmBgYA0KDQoNCg==